The approaches described in this section are approaches that could be pursued, but not necessarily approaches that have been previously conceived or pursued. Therefore, unless otherwise indicated, it is not to be assumed that any of the approaches described in this section qualify as prior art, merely by virtue of their inclusion in this section.
Traditionally, when blocks of memory are transferred between processing entities (such as processes or threads), copies of at least a portion of the blocks of memory have to be performed. The transfer of memory blocks between processing entities frequently occurs in the context of a pipeline. A pipeline is a set of elements that operate, in series, on the same pieces of information, such that the output of one element of the pipeline serves as the input of the next element in the pipeline. The elements of a pipeline are often executed in parallel or in time-sliced fashion. An element of a pipeline may include one or multiple processing entities.
For example, consider a pipeline scenario in which a block, which contains both audio data and video data, is read from disk, modified, and eventually played back to a user. In the first stage, a first processing entity (e.g. a disk reader process) reads the block of data from disk into a contiguous block of volatile memory. In the second stage, a second processing entity (e.g. a parsing process) identifies the portion of the block of memory that corresponds to audio data and the portion of the block of memory that corresponds to video data. The second processing entity may then “split” the block of memory by creating a copy of the audio data and sending the copy of the audio data to a processing entity at a third stage (e.g. an audio processing process) that decompresses the copy of the audio data and acts as a demultiplexer to separate the audio data into its appropriate frequency components. The second processing entity may also create a copy of the video data and sends the copy of the video data to a different third stage processing entity (e.g. a video processing process) that decompresses the copy of the video data and demultiplexes the corresponding video signals.
Creating copies of blocks of memory is an expensive operation in terms of requiring significant computation time and requiring a significant amount of memory, especially when such copying is performed several times between many stages of a pipeline. Thus, there is a need to improve the performance of transferring blocks of memory from one processing entity to another.